package Java项目.学生管理系统登录;

import Java项目.学生管理系统.Text;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class UPInterface {
    public static void main(String[] args) {
        //存储用户名
        ArrayList<User> list=new ArrayList<>();
        //登录界面
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作1登录 2注册 3忘记密码");
            Scanner sc=new Scanner(System.in);
            System.out.print("请输入选择的操作:");
            String select=sc.next();
            switch (select){
                case "1"->{System.out.println("登录");login(list);}
                case "2"->{System.out.println("注册");signUP(list);}
                case "3"->{System.out.println("忘记密码");forgetPassword(list);}
                default->{System.out.println("输入无效,不存在该操作,请重新输入!");}
            }
        }
    }
    //一.登录
    public static void login(ArrayList<User> u){
        Scanner sc =new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.print("用户名:");
            String user=sc.next();
            //判断用户名是否注册
            boolean exists=isSole(u,user);
            if (!exists){
                System.out.println("用户名"+exists+"未注册!请先完成注册后,在进行登录!");
                return;
            }
            System.out.print("请输入密码:");
            String  password=sc.next();

            while (true) {
                String rightCode=isNumber();
                System.out.println("当前验证码为:"+rightCode);
                System.out.print("请输入验证码:");
                String yan=sc.next();
                if (!rightCode.equalsIgnoreCase(yan)){
                    System.out.println("验证码输入错误!请重新输入!");
                    continue;
                }
                System.out.println("验证码输入正确!");
                break;
            }
            //判断用户名和密码是否正确
            //封装思想
            User user1 = new User(user,password,null,null);
            boolean result=checkInfo(user1,u);
            if (!result){
                System.out.println("用户名或密码输入错误,请重新输入!");
                if (i==2){
                    System.out.println("当前账号"+user+"被锁定!");
                }
                continue;
            }
                Text.main(null);
            return;
        }

    }

    private static boolean checkInfo(User user1, ArrayList<User> user) {
        for (int i = 0; i < user.size(); i++) {
            //获取每一个对象
            User user2 = user.get(i);
            if (user2.getUserName().equals(user1.getUserName())&&
                    user2.getPassword().equals(user1.getPassword())){
                return true;
            }
        }
        return false;
    }

    //二.注册
    public static void signUP(ArrayList<User> users){
        Scanner sc=new Scanner(System.in);
        String username=null;
        //用户名校验
        while (true) {
            System.out.println("请输入注册用户名:");
            username=sc.next();
            //先验证格式是否正确,在判断是否唯一
            boolean flag=cheakUsername(username);
            //这里说明用户名格式满足
            if (!flag){
                System.out.println("用户格式不符合要求,请重新输入!");
                continue;
            }
            //校验是否唯一
            boolean flag1=isSole(users,username);
            if (flag1){
                System.out.println("当前用户名已经存在,请重新输入");
                continue;
            }
            break;
        }
        //密码
        String password1=null;
        while (true) {
            System.out.print("请输入要注册的密码:");
            password1=sc.next();
            System.out.print("请再次输入要注册的密码:");
            String password2=sc.next();
            if (!password1.equals(password2)){
                System.out.println("两次密码输入不一致,请重新输入!");
                continue;
            }
            break;
        }
        //身份证校验
        String idCard=null;
        while (true) {
            System.out.print("请输入您的身份证id:");
            idCard=sc.next();
            boolean check=checkIdCard(idCard);
            if (!check){
                System.out.println("身份证格式错误,请重新输入!");
                continue;
            }
            break;
        }
        //检验手机号码
        String phone=null;
        while (true) {
            System.out.println("请输入手机号码:");
            phone=sc.next();
            //判断手机号长度是否为11位.
            boolean len=phone.length()==11;
            if (!len){
                System.out.println("手机号长度错误,请重新输入!");
                continue;
            }
            //判断手机号第一位不为0
            boolean start=phone.startsWith("0");   //false 表示不是0
            if (start){
                System.out.println("手机号开头错误,请重新输入");
                continue;
            }
            break;
        }
        //创建用户对象
        User user=new User(username,password1,idCard,phone);
        //添加用户到集合
        users.add(user);
        System.out.println("用户注册成功!");
    }
    //1.校验用户名格式
    public static boolean cheakUsername(String user){
        //判断用户名长度是否符合3~15
        int len=user.length();
        if (len<3||len>15){
            return false;
        }
        //到这里说明长度是符合要求的
        //判断用户名是否是用字母和数字组成,且不为纯数字--->是否是字母和数字isWordNumber,是否是纯数字->allNumber
        boolean flag1=isWordNumber(user);
        boolean flag2=allNumber(user);// ture 纯数字  false 非纯数字
        if (flag1&&!flag2){
            return true;
        }
        return false;
    }
    //2.校验身份证是否正确
    public static boolean checkIdCard(String id){
        //判断长度是否正确
        boolean lenFlag=id.length()==18;
        if (!lenFlag){return false;}
        //判断第一位不能是0开头,
        String chFast=id.substring(0,1);           //此处还有一种方法id.startWith("0")判断是否一0开头
        if (chFast.equals("0")){return false;}
        //判断前17为必须是数字
        String id17=id.substring(0,17);
        boolean num=allNumber(id17);
        if (!num){return false;}
        //判断最后一位是数字或者'x'或者'X
        String end=id.substring(17);
        char chEnd=end.charAt(0);
        boolean isNumOrX=((chEnd-'0'>=0)&&(chEnd-'0'<=9))||chEnd=='x'||chEnd=='X';
        return isNumOrX;
    }

    //三.忘记密码
    public static void forgetPassword(ArrayList<User> user){
        System.out.print("请输入忘记密码的账号:");
        Scanner sc=new Scanner(System.in);
        String ur=sc.next();
        //判断账号是否存在
        boolean exits=isSole(user,ur);
        if (!exits){
            System.out.println("用户名"+ur+"未注册.");
            return;
        }
        //录入身份证号和手机号
        System.out.print("请输入您的身份证:");
        String idCard=sc.next();
        System.out.print("请输入您的手机号码:");
        String phone = sc.next();
        //判断手机号身份证号是否一致
        //封装思想:把所有的数据都封装到这个类里面,不存在的用null表示,在把这个类和数据中的数据类进行比对.
        User unInfo=new User(ur,null,idCard,phone);
        int result=checkIdCardPhone(user,unInfo);
        if (result==-1){
            System.out.println("账号信息不匹配,修改失败!");
        }else {
            System.out.print("请输入新密码:");
            String newPassword=sc.next();
            user.get(result).setPassword(newPassword);
            System.out.println("密码修改成功!");
        }
    }
    private static int checkIdCardPhone(ArrayList<User> user, User unInfo) {
        //遍历集合,判断用户的身份证和手机号是否一致
        for (int i = 0; i < user.size(); i++) {
            //获得每一个对象
            User user1 = user.get(i);
            if (user1.getUserName().equals(unInfo.getUserName())&&user1.getIdCard().equals(unInfo.getIdCard())
            &&user1.getPhoneNumber().equals(unInfo.getPhoneNumber())){ return i;}
        }
        return -1;
    }

    //方法
    //定义方法判断用户名是否存在
    public static boolean isSole(ArrayList<User> u,String userName){
            //集合中没有用户返回不存在
            if (u.size()==0){
                return false;
            }else {
                for (int i = 0; i < u.size(); i++) {
                    if (u.get(i).getUserName().equals(userName)){
                        return true;
                    }
                }
                return false;
            }
    }

    //定义方法判断是否是纯数字
    public static boolean allNumber(String num){
        char[] ch=num.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            //判断是否是数字
            int finger=ch[i]-'0';
            if (finger<0||finger>9){
                return false;
            }
        }
        return true;
    }

    //生成5位数的验证码,4位英文,1位数字,数字可以在任意位置
    public static String isNumber() {
        //存储字母的数组
        char[] a_Z = new char[52];
        for (int i = 0; i < a_Z.length; i++) {
            //生成小写字母
            if (i < 26) {
                char new_ch = (char) (i + 97);
                a_Z[i] = new_ch;
            } else {
                //生成大写字母
                char da = (char) (i + 65 - 26);
                a_Z[i] = da;
            }
        }
        //随机取4个字母
        Random ra = new Random();
        //拼接
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int wordIndex = ra.nextInt(52);
            sb.append(a_Z[wordIndex]);
        }
        //随机取0-9的数字
        int num = ra.nextInt(10);
        //拼接到字符串中
        sb.append(num);
        char[] strch = sb.toString().toCharArray();
        int indenx = ra.nextInt(strch.length);
        char tep = strch[strch.length - 1];
        strch[strch.length - 1] = strch[indenx];
        strch[indenx] = tep;
        String str = new String(strch);
        return str;

    }

    //判断用户名是否是由字母和数字组成
    public static boolean isWordNumber(String str){
        //转化字符串为字符数组
        char[] chStr=str.toCharArray();
        for (int i = 0; i < chStr.length; i++) {
            //判断字符串是否是字符和数字
            boolean flag=(chStr[i]>='a'&&chStr[i]<='z')||(chStr[i]>='A'&&chStr[i]<='Z')||(chStr[i]>='0'&&chStr[i]<='9');
            if (!flag){
                return false;
            }
        }
        return true;
    }

}
